/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package documenteditor.entidade.model;

import documenteditor.entidade.model.dominio.AtivacaoPonto;
import documenteditor.entidade.model.dominio.TipoValidadePonto;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

/**
 *
 * @author gleidson.moura
 */

@Entity
@Table(name="CARTAO_FIDELIDADE")
@SequenceGenerator(name="GEN_CARTAO_FIDELIDADE", sequenceName="GEN_CARTAO_FIDELIDADE_ID")
@NamedQueries({
    @NamedQuery(name = "CartaoFidelidade.findAll", query = "SELECT c FROM CartaoFidelidade c"),
    @NamedQuery(name = "CartaoFidelidade.findByIdCartaoFidelidade", query = "SELECT c FROM CartaoFidelidade c WHERE c.idCartaoFidelidade = :idCartaoFidelidade"),
    @NamedQuery(name = "CartaoFidelidade.findByAtivacaoPonto", query = "SELECT c FROM CartaoFidelidade c WHERE c.ativacaoPonto = :ativacaoPonto"),
    @NamedQuery(name = "CartaoFidelidade.findByDataAquisicao", query = "SELECT c FROM CartaoFidelidade c WHERE c.dataAquisicao = :dataAquisicao"),
    @NamedQuery(name = "CartaoFidelidade.findByTipoValidadePonto", query = "SELECT c FROM CartaoFidelidade c WHERE c.tipoValidadePonto = :tipoValidadePonto")})
public class CartaoFidelidade implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name="ID_CARTAO_FIDELIDADE")
    @GeneratedValue(strategy = GenerationType.AUTO, generator="GEN_CARTAO_FIDELIDADE")
    private Long idCartaoFidelidade;

    @Column(name="DATA_AQUISICAO", nullable=false)
    @Temporal(TemporalType.DATE)
    private Date dataAquisicao;


    @Column(name="TIPO_VALIDADE_PONTO", nullable=false)
    @Enumerated(EnumType.STRING)
    private TipoValidadePonto tipoValidadePonto;

    @Column(name="ATIVACAO_PONTO", nullable=false)
    @Enumerated(EnumType.STRING)
    private AtivacaoPonto ativacaoPonto;

    @OneToOne(cascade = CascadeType.ALL, mappedBy="cartaoFidelidade", targetEntity=Cliente.class)
    @ForeignKey(name="FK_CARTAO_FIDELIDADE_CLIENTE")
    private Cliente cliente;
    
    @OneToMany(targetEntity=PontoFidelidade.class, fetch=FetchType.LAZY, mappedBy="cartaoFidelidade")
    @ForeignKey(name="FK_PONTO_FIDEL_CTAO_FIDELID")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private List<PontoFidelidade> pontoFidelidade = new ArrayList<PontoFidelidade>();

    public Long getIdCartaoFidelidade() {
        return idCartaoFidelidade;
    }

    public void setIdCartaoFidelidade(Long idCartaoFidelidade) {
        this.idCartaoFidelidade = idCartaoFidelidade;
    }

    public AtivacaoPonto getAtivacaoPonto() {
        return ativacaoPonto;
    }

    public void setAtivacaoPonto(AtivacaoPonto ativacaoPonto) {
        this.ativacaoPonto = ativacaoPonto;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Date getDataAquisicao() {
        return dataAquisicao;
    }

    public void setDataAquisicao(Date dataAquisicao) {
        this.dataAquisicao = dataAquisicao;
    }

    public List<PontoFidelidade> getPontoFidelidade() {
        return pontoFidelidade;
    }

    public void setPontoFidelidade(List<PontoFidelidade> pontoFidelidade) {
        this.pontoFidelidade = pontoFidelidade;
    }

    public TipoValidadePonto getTipoValidadePonto() {
        return tipoValidadePonto;
    }

    public void setTipoValidadePonto(TipoValidadePonto tipoValidadePonto) {
        this.tipoValidadePonto = tipoValidadePonto;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idCartaoFidelidade != null ? idCartaoFidelidade.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CartaoFidelidade)) {
            return false;
        }
        CartaoFidelidade other = (CartaoFidelidade) object;
        if ((this.idCartaoFidelidade == null && other.idCartaoFidelidade != null) || (this.idCartaoFidelidade != null && !this.idCartaoFidelidade.equals(other.idCartaoFidelidade))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        Integer qtdTotal = new Integer(0);
        for (PontoFidelidade ponto : pontoFidelidade) {
            if (ponto.getPontoValido()) {
                qtdTotal += ponto.getQuantidade();
            }
        }
        return qtdTotal.toString();
    }

}
